package com.lx.preferred.mall.authcenter.config;

import com.lx.preferred.mall.authcenter.service.PreferredUserDetailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

import javax.annotation.Resource;

/**
 * @author lX
 * @version JDK 8
 * @className WebSecurityConfig (此处以class为例)
 * @date 2024/12/12
 * @description SpringSecurity配置
 */
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Bean
  public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
  }

  @Resource
  private PreferredUserDetailService userDetailService;

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    // 实现UserDetailsService获取用户信息
    auth.userDetailsService(userDetailService);
  }

  @Bean
  @Override
  public AuthenticationManager authenticationManagerBean() throws Exception {
    // oauth2 密码模式需要拿到这个bean
    return super.authenticationManagerBean();
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.formLogin().permitAll()
      .and().authorizeRequests()
      .antMatchers("/oauth/**").permitAll()
      .anyRequest()
      .authenticated()
      .and().logout().permitAll()
      .and().csrf().disable();
  }

}
